#include<stdio.h>
#include<conio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Student
{
	int id;
    char name[50];
    char sex[4];
    int age;
    char department[50];
    int high;
    float weight;
    float chest;
    int date;
}Student;

  typedef struct Node
{
	Student stu;
	struct Node* pNew;//指向下一个节点
}Node;
Node *g_pHead=NULL;

typedef struct history
{
	int id;
    char name[50];
    char sex[4];
    int age;
    char department[50];
    int date;
    char diagnose[100];
    
}diagnose;

 typedef struct node
{
	history stu;
	struct node* pNext;
}node;
node *g_phead=NULL;

void fridisplay_mun()
{
	printf("\t\t\t\t\t********************************************\n");
	printf("\t\t\t\t\t**欢迎使用大连民族大学学生健康档案管理系统**\n");
	printf("\t\t\t\t\t********************************************\n");
	printf("\t\t\t\t\t***       1      学生体检文件            ***\n");
	printf("\t\t\t\t\t***       2      学生病例文件            ***\n");
	printf("\t\t\t\t\t***       0        返回主页              ***\n");
	printf("\t\t\t\t\t********************************************\n");
}

void secdisplay_mun()
{
	printf("\t\t\t\t\t********************************************\n");
	printf("\t\t\t\t\t**欢迎使用大连民族大学学生健康档案管理系统**\n");
	printf("\t\t\t\t\t********************************************\n");
	printf("\t\t\t\t\t***       1      登记学生信息            ***\n");
	printf("\t\t\t\t\t***       2      删除学生信息            ***\n");
	printf("\t\t\t\t\t***       3      修改学生信息            ***\n");
	printf("\t\t\t\t\t***       4      查询学生信息            ***\n");
	printf("\t\t\t\t\t***       5      统计学生信息            ***\n");
	printf("\t\t\t\t\t***       6      打印学生信息            ***\n");
	printf("\t\t\t\t\t***       7      读取保存信息            ***\n");
	printf("\t\t\t\t\t***       8      保存学生信息            ***\n");
	printf("\t\t\t\t\t***       0        返回主页              ***\n");
	printf("\t\t\t\t\t********************************************\n");
}

void thrdisplay_mun()
{
	printf("\t\t\t\t\t********************************************\n");
	printf("\t\t\t\t\t**欢迎使用大连民族大学学生健康档案管理系统**\n");
	printf("\t\t\t\t\t********************************************\n");
	printf("\t\t\t\t\t***       1      登记学生信息            ***\n");
	printf("\t\t\t\t\t***       2      删除学生信息            ***\n");
	printf("\t\t\t\t\t***       3      修改学生信息            ***\n");
	printf("\t\t\t\t\t***       4      查询学生信息            ***\n");
	printf("\t\t\t\t\t***       5      打印学生信息            ***\n");
	printf("\t\t\t\t\t***       6      读取保存信息            ***\n");
	printf("\t\t\t\t\t***       7      保存学生信息            ***\n");
	printf("\t\t\t\t\t***       0        返回主页              ***\n");
	printf("\t\t\t\t\t********************************************\n");
}

void statistics_mun()
{
	printf("\t\t\t\t\t********************************************\n");
	printf("\t\t\t\t\t**欢迎使用大连民族大学学生健康档案管理系统**\n");
	printf("\t\t\t\t\t********************************************\n");
	printf("\t\t\t\t\t          1      统计学生人数               \n");
	printf("\t\t\t\t\t          2      学生年龄平均值             \n");
	printf("\t\t\t\t\t          3      学生体重平均值             \n");
	printf("\t\t\t\t\t          4      学生身高平均值             \n");
	printf("\t\t\t\t\t          5      学生胸围平均值             \n");
	printf("\t\t\t\t\t          0        返回主页                 \n");
	printf("\t\t\t\t\t********************************************\n");
}

void check()
{
	FILE* file;
	file=fopen("9.txt","r");
	if (file==NULL)
	{
		printf("文件打开失败\n");
		return ;
	}
	Student stu;
	while (fread(&stu,1,sizeof(Student),file))
	{
	    Node* pNewNode=(Node*)malloc(sizeof(Node));
	    pNewNode->pNew=NULL;
	    memcpy(pNewNode,&stu,sizeof(Student));
	    if (g_pHead==NULL)
        {
    	    g_pHead=pNewNode;
	    }
	    else
	    {
	        pNewNode->pNew=g_pHead;
		    g_pHead=pNewNode;
	    }
	}
	fclose(file);
	printf("加载数据成功:\n");
}

void checkhistory()
{
	FILE* file;
	file=fopen("8.txt","r");
	if (file==NULL)
	{
		printf("文件打开失败\n");
		return ;
	}
	history stu;
	while (fread(&stu,1,sizeof(history),file))
	{
	    node* pNextnode=(node*)malloc(sizeof(node));
	    pNextnode->pNext=NULL;
	    memcpy(pNextnode,&stu,sizeof(history));
	    if (g_phead==NULL)
        {
    	    g_phead=pNextnode;
	    }
	    else
	    {
	        pNextnode->pNext=g_phead;
		    g_phead=pNextnode;
	    }
	}
	fclose(file);
	printf("加载数据成功:\n");
}
//录入学生信息
void inputStudent()
{
	Node* pNewNode=(Node*)malloc(sizeof(Node));//创建新的节点
	pNewNode->pNew=NULL;
    if (g_pHead==NULL)
    {
    	g_pHead=pNewNode;
	}
	else
	{
	    pNewNode->pNew=g_pHead;
		g_pHead=pNewNode;
	}
	printf("请输入学生学号：\n");
	scanf("%d",&pNewNode->stu.id);
	printf("请输入学生姓名：\n");
	scanf("%s",pNewNode->stu.name);
	printf("请输入学生性别：\n");
	scanf("%s",pNewNode->stu.sex);
	printf("请输入学生年龄：\n");
    scanf("%d",&pNewNode->stu.age);
    printf("请输入学生系别：\n");
    scanf("%s",&pNewNode->stu.department);
    printf("请输入学生身高：\n");
    scanf("%d",&pNewNode->stu.high);
    printf("请输入学生体重：\n");
    scanf("%f",&pNewNode->stu.weight);
    printf("请输入学生胸围：\n");
    scanf("%f",&pNewNode->stu.chest);
    printf("请输入学生日期：\n");
    scanf("%d",&pNewNode->stu.date);
    printf("学生信息录入成功\n");
   
}

void saveStudent()
{
	FILE* file;
	file=fopen("9.txt","w");
	if (file==NULL)
	{
		printf("文件打开失败\n");
		return ;
	}
	Node* p=g_pHead;
	while (p!=NULL)
	{
		fwrite(&p->stu,1,sizeof(Student),file);
		p=p->pNew;
	}
	fclose(file);
	printf("\n数据保存成功\n");
}


void printStudent()
{
	
	Node* p=g_pHead;
	while (p!=NULL)
	{
	printf("*\t学号\t*\t姓名\t*\t性别\t*\t年龄\t*\t系别\t*\t身高\t*\t体重\t*\t胸围\t*\t日期*\n");
	printf("*\t%d\t*\t%s\t*\t%s\t*\t%d\t*\t%s\t*\t%d\t*\t%.2f\t*\t%.2f\t*\t%d*\n",
	p->stu.id,
	p->stu.name,
	p->stu.sex,
	p->stu.age,
	p->stu.department,
	p->stu.high,
	p->stu.weight,
	p->stu.chest,
	p->stu.date);
	p=p->pNew;
	}	
	
}




void detlStudent()
{
	int id;
	printf("请输入要删除的学生学号\n");
	scanf("%d",&id);
	Node* p1, *p2;
	if (g_pHead->stu.id==id)
	{
		p1=g_pHead;
		g_pHead=g_pHead->pNew;
		free(p1);
		system("cls");
	    system("pause");
		return;
	}
	
	Node* p=g_pHead;
	while (p->pNew!=NULL)
	{
		if (p->pNew->stu.id==id)
		{
			p2=p->pNew;
			p->pNew=p->pNew->pNew;
			free(p2);
			system("cls");
	        system("pause");
			return;
		}
		p=p->pNew;
		if(p->pNew==NULL)
		{
			break;
		}
		
	}
	if (p->pNew==NULL)
	{
		printf("没有找到\n");
	}
	
}

void editStudent()
{
	int id;
	printf("请输入需要修改的学生学号：\n");
	scanf("%d",&id);
	Node* p=g_pHead;
	printf("请输入修改信息");
	while (p !=NULL)
	{
		if (p->stu.id==id){
			
			printf("学号\n");
			scanf("%d",&p->stu.id);
			printf("姓名\n");
			scanf("%s",p->stu.name);
			printf("性别\n");
			scanf("%s",p->stu.sex);
			printf("年龄\n");
			scanf("%d",&p->stu.age);
			printf("系别\n");
			scanf("%s",p->stu.department);
			printf("身高\n");
			scanf("%d",&p->stu.high);
			printf("体重\n");
			scanf("%f",&p->stu.weight);
			printf("胸围\n");
			scanf("%f",&p->stu.chest);
			printf("日期\n");
			scanf("%d",&p->stu.date);
		    printf("修改成功\n");
		    break;
		}
		p=p->pNew;
	}
	if (p==NULL)
	{
		printf("没有找到该学生信息\n");
	}
}

Node* inqurStudent()
{
	int id;
	printf("请输入要查询的学生学号：\n");
	scanf("%d",&id);
	Node* p=g_pHead;
	while (p !=NULL)
	{
		if (p->stu.id==id){
			return p;
		}
		p=p->pNew;
	}
	return NULL;

}

int Count()
{
	int Count = 0;
	Node* p=g_pHead;
	while (p!=NULL)
	{
		Count++;
		p=p->pNew;
	}
	return Count;
}

void inputhistory()
{
	node* pNextnode=(node*)malloc(sizeof(node));
	pNextnode->pNext=NULL;
    if (g_phead==NULL)
    {
    	g_phead=pNextnode;
	}
	else
	{
	    pNextnode->pNext=g_phead;
		g_phead=pNextnode;
	}
	printf("请输入学生学号：\n");
	scanf("%d",&pNextnode->stu.id);
	printf("请输入学生姓名：\n");
	scanf("%s",pNextnode->stu.name);
	printf("请输入学生性别：\n");
	scanf("%s",pNextnode->stu.sex);
	printf("请输入学生年龄：\n");
    scanf("%d",&pNextnode->stu.age);
    printf("请输入学生系别：\n");
    scanf("%s",&pNextnode->stu.department);
    printf("请输入学生诊断：\n");
    scanf("%s",&pNextnode->stu.diagnose);
    printf("请输入学生日期：\n");
    scanf("%d",&pNextnode->stu.date);
    printf("学生信息录入成功\n");

}

void savehistory()
{
		FILE* file;
	    file=fopen("8.txt","w");
	    if (file==NULL)
	    {
		    printf("文件打开失败\n");
		    return ;
	    }
	    node* q=g_phead;
	    while (q!=NULL)
	    {
		    fwrite(&q->stu,1,sizeof(history),file);
		    q=q->pNext;
	    }
	    fclose(file);
	    printf("\n数据保存成功\n");
}


void printhistory()
{
	node* q=g_phead;
	while (q!=NULL)
	{
		printf("*\t学号\t*\t姓名\t*\t性别\t*\t年龄\t*\t系别\t*\t诊断\t*\t日期*\n");
		printf("*\t%d\t*\t%s\t*\t%s\t*\t%d\t*\t%s\t*\t%s\t*\t%d*\n",
		q->stu.id,
		q->stu.name,
	    q->stu.sex,
		q->stu.age,
	    q->stu.department,
		q->stu.diagnose,
		q->stu.date);
	    q=q->pNext;
	}	
	
}

void detlhistory()
{
    int id;
	printf("请输入要删除的学生学号\n");
	scanf("%d",&id);
	node* q1, *q2;
	if (g_phead->stu.id==id)
	{
		q1=g_phead;
		g_phead=g_phead->pNext;
		free(q1);
		system("cls");
	    system("pause");
		return;
	}
	
	node* q=g_phead;
	while (q->pNext!=NULL)
	{
		if (q->pNext->stu.id==id)
		{
			q2=q->pNext;
			q->pNext=q->pNext->pNext;
			free(q2);
			system("cls");
	        system("pause");
			return;
		}
		q=q->pNext;
		if(q->pNext==NULL)
		{
			break;
		}
		
	}
	if (q->pNext==NULL)
	{
		printf("没有找到\n");
	}
	system("pause");
	
}

void edithistory()
{
	int id;
	printf("请输入需要修改的学生学号：\n");
	scanf("%d",&id);
	node* q=g_phead;
	while (q !=NULL)
	{
		if (q->stu.id==id){
			printf("学号\n");
			scanf("%d",&q->stu.id);
			printf("姓名\n");
			scanf("%s",q->stu.name);
			printf("性别\n");
			scanf("%s",q->stu.sex);
			printf("年龄\n");
			scanf("%d",&q->stu.age);
			printf("系别\n");
			scanf("%s",q->stu.department);
			printf("诊断\n");
			scanf("%s",q->stu.diagnose);
			printf("日期\n");
			scanf("%d",&q->stu.date);
		    printf("修改成功\n");
		    break;
		}
		q=q->pNext;
	}
	if (q==NULL)
	{
		printf("没有找到该学生信息\n");
	}
}

node* inqurhistory()
{
	int id;
	printf("请输入要查询的学生学号：\n");
	scanf("%d",&id);
	node* q=g_phead;
	while (q !=NULL)
	{
		if (q->stu.id==id){
			return q;
		}
		q=q->pNext;
	}
	return NULL;

}
double aveage()
{
	int n=Count();
	double sum=0;
	Node* p=g_pHead;
	while (p!=NULL){
		sum+=p->stu.age;
		p=p->pNew;
	}
	double ave_age=(double)sum/n;
	return ave_age;
}

double aveweight()
{
	int n=Count();
	double sum=0;
	Node* p=g_pHead;
	while (p!=NULL){
		sum+=p->stu.weight;
		p=p->pNew;
	}
	double ave_weight=(double)sum/n;
	return ave_weight;
}

double avehigh()
{
	int n=Count();
	double sum=0;
	Node* p=g_pHead;
	while (p!=NULL){
		sum+=p->stu.high;
		p=p->pNew;
	}
	double ave_high=(double)sum/n;
	return ave_high;
}

double avechest()
{
	int n=Count();
	double sum=0;
	Node* p=g_pHead;
	while (p!=NULL){
		sum+=p->stu.chest;
		p=p->pNew;
	}
	double ave_chest=(double)sum/n;
	return ave_chest;
}



void Menu3()
{
	while(1){
	system("cls");
	statistics_mun();
	char ch=getch();
		switch(ch)
		{
			case '0':{
				return;
			}
			case '1':{
				printf("学生总人数%d\n",Count());
				break;
			}
			case '2':{
				double ave_age=aveage();
				printf("学生的平均年龄为：%lf\n",ave_age);
				break;
			}
			case '3':{
				double ave_weight=aveweight();
				printf("学生的平均体重为：%lf\n",ave_weight);
				break;
			}
			case '4':{
				double ave_high=avehigh();
				printf("学生的平均身高为：%lf\n",ave_high);
				break;
			}
			case '5':{
				double ave_chest=avechest();
				printf("学生的平均胸围为：%lf\n",ave_chest);
				break;
			}
			default:{
	    	    printf("输入错误\n");
		        break;
		    }
	    }
	    system("pause");
	}
}

void Menu1()
{
while (1)
	{
	    system("cls");
	    secdisplay_mun();
	    int a;
	    scanf("%d", &a);
	    switch(a)
	    {
		    case 0:{
		        return ;
		        break;
			}
		    case 1:{
			    inputStudent();
			    
			    break;
		    }
		    case 2:{
			    detlStudent();
			    break;
		    }
		    case 3:{
			    editStudent();
			    break;
		    }
		    case 4:{
			    Node* p=inqurStudent();
			    if (p!=NULL)
			    {
			        printf("*\t学号\t*\t姓名\t*\t性别\t*\t年龄\t*\t系别\t*\t身高\t*\t体重\t*\t胸围\t*\t日期*\n");
		            printf("*\t%d\t*\t%s\t*\t%s\t*\t%d\t*\t%s\t*\t%d\t*\t%.2f\t*\t%.2f\t*\t%d*\n",
		            p->stu.id,
		            p->stu.name,
	                p->stu.sex,
		            p->stu.age,
	    	        p->stu.department,
		            p->stu.high,
		            p->stu.weight,
		            p->stu.chest,
		            p->stu.date);
			    }
			    else 
			    {
			        printf("没有找到该学员");
			    }
			    break;
		        }
		        
		        case 5:{
		        	Menu3();
					break;
				}
		        
		    case 6:{
			    printStudent();
			    break;
		    }
		    case 7:{
		    	check();
				break;
			}
			case 8:{
				saveStudent();
				break;
			}
			
	        default:{
	    	    printf("输入错误\n");
		        break;
		    }
	    }
	    system("pause");
	}
}

void Menu2()
{
	while (1)
	{
		system("cls");
	    thrdisplay_mun();
	    int a;
	    scanf("%d", &a);
	    switch(a)
	    {
		    case 0:{
		        return ;
		        break;
			}
		    case 1:{
			    inputhistory();
			    break;
		    }
		    case 2:{
			    detlhistory();
			    break;
		    }
		    case 3:{
			    edithistory();
			    break;
		    }
		    case 4:{
			    node* q=inqurhistory();
			    if (q !=NULL)
			    {
			        printf("*\t学号\t*\t姓名\t*\t性别\t*\t年龄\t*\t系别\t*\t诊断\t*\t日期*\n");
		            printf("*\t%d\t*\t%s\t*\t%s\t*\t%d\t*\t%s\t*\t%s\t*\t%d*\n",
		            q->stu.id,
		            q->stu.name,
	                q->stu.sex,
		            q->stu.age,
	    	        q->stu.department,
		            q->stu.diagnose,
		            q->stu.date);
			    }
			    else 
			    {
			        printf("没有找到该学员");
			    }
			    break;
		        }
		    case 5:{
			    printhistory();
			    break;
		    }
		    case 6:{
		    	checkhistory();
				break;
			}
			case 7:{
				savehistory();
				break;
			}
	        default:{
	    	    printf("输入错误\n");
		        break;
		    }
	    }
	    system("pause");
	}
}

void Menu()
{
	while(1){
		system("cls");
		fridisplay_mun();
		char ch=getch();
		switch(ch)
		{
			case '0':{
				return;
			}
			case '1':{
				Menu1();
				break;
			}
			case '2':{
				Menu2();
				break;
			}
			default:{
	    	    printf("输入错误\n");
		        break;
		    }
	    }
	    system("pause");
    }
}

int main()
{
	Menu();
}